﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using Studio7i.CapaDominio;
using System.Data.SqlClient;
using Studio7i.CapaPersistencia;

namespace Studio7i.CapaPersistencia.DAO
{
    public class ArmadoSalaDAO : IArmadoDeSalaDAO
    {
        // Dependencias
        ISalaDAO salaDAO = new SalaDAO();
        IInstrumentoDAO instrumentoDAO = new InstrumentoDAO();
        IServicioDAO servicioDAO = new ServicioDAO();
        IAdministradorDAO admDAO = new AdministradorDAO();

        // Métodos CRUD
        public ArmadoDeSala Crear(ArmadoDeSala armadoDeSalaCrear)
        {
            string _Sentencia = @"INSERT INTO Armado_Sala (CoArmado,SsArmado,CoSala,CoInstrumento,CoServicio, CoAdministrador)
            VALUES(@CoArmado,@SsArmado,@CoSala,@CoInstrumento,@CoServicio,@CoAdministrador)";
            int _NuevoCodigo = GenerarNuevoCodigo();
            using (SqlConnection _Conexion = new SqlConnection(ConexionUtil.ObtenerCadena()))
            {
                _Conexion.Open();
                using (SqlCommand _Comando = new SqlCommand(_Sentencia, _Conexion))
                {
                    _Comando.Parameters.Add(new SqlParameter("@CoArmado", _NuevoCodigo));
                    _Comando.Parameters.Add(new SqlParameter("@SsArmado", armadoDeSalaCrear.SsArmado));
                    _Comando.Parameters.Add(new SqlParameter("@CoSala", armadoDeSalaCrear.Sala.CoSala));
                    _Comando.Parameters.Add(new SqlParameter("@CoInstrumento", armadoDeSalaCrear.Instrumento.codigo));
                    _Comando.Parameters.Add(new SqlParameter("@CoServicio", armadoDeSalaCrear.Servicio.codigo));
                    _Comando.Parameters.Add(new SqlParameter("@CoAdministrador", armadoDeSalaCrear.Administrador.CoAdministrador));
                    _Comando.ExecuteNonQuery();
                }
            }
            return Obtener(_NuevoCodigo);
        }
        public ArmadoDeSala Obtener(int codigo)
        {
            string _Sentencia = @"SELECT CoArmado, SsArmado, CoSala, CoInstrumento, CoServicio,CoAdministrador 
                FROM Armado_Sala WHERE CoArmado = @CoArmado";
            ArmadoDeSala ArmadoDeSalaCreado = null;
            using (SqlConnection _Conexion = new SqlConnection(ConexionUtil.ObtenerCadena()))
            {
                _Conexion.Open();
                using (SqlCommand _Comando = new SqlCommand(_Sentencia, _Conexion))
                {
                    _Comando.Parameters.Add(new SqlParameter("@CoArmado", codigo));
                    using (SqlDataReader _Resultado = _Comando.ExecuteReader())
                    {
                        if (_Resultado.Read())
                        {
                            ArmadoDeSalaCreado = new ArmadoDeSala();
                            ArmadoDeSalaCreado.CoArmado = (int)_Resultado["CoArmado"];
                            ArmadoDeSalaCreado.SsArmado = (decimal)_Resultado["SsArmado"];
                            ArmadoDeSalaCreado.Sala = salaDAO.Obtener((int)_Resultado["CoSala"]);
                            ArmadoDeSalaCreado.Instrumento = instrumentoDAO.Obtener((int)_Resultado["CoInstrumento"]);
                            ArmadoDeSalaCreado.Servicio = servicioDAO.Obtener((int)_Resultado["CoServicio"]);
                            ArmadoDeSalaCreado.Administrador = admDAO.Obtener((int)_Resultado["CoAdministrador"]);
                        }
                    }
                }
            }
            return ArmadoDeSalaCreado;
        }

        public ArmadoDeSala Modificar(ArmadoDeSala ArmadoDeSalaModificar)
        {
            string _Sentencia = @"UPDATE Armado_Sala SET SsArmado = @SsArmado, CoSala = @CoSala, CoInstrumento = @CoInstrumento, CoServicio = @CoServicio, CoAdministrador = @CoAdministrador
                                WHERE CoArmado = @CoArmado";
            using (SqlConnection _Conexion = new SqlConnection(ConexionUtil.ObtenerCadena()))
            {
                _Conexion.Open();
                using (SqlCommand _Comando = new SqlCommand(_Sentencia, _Conexion))
                {
                    _Comando.Parameters.Add(new SqlParameter("@SsArmado", ArmadoDeSalaModificar.SsArmado));
                    _Comando.Parameters.Add(new SqlParameter("@CoSala", ArmadoDeSalaModificar.Sala.CoSala));
                    _Comando.Parameters.Add(new SqlParameter("@CoInstrumento", ArmadoDeSalaModificar.Instrumento.codigo));
                    _Comando.Parameters.Add(new SqlParameter("@CoServicio", ArmadoDeSalaModificar.Servicio.codigo));
                    _Comando.Parameters.Add(new SqlParameter("@CoArmado", ArmadoDeSalaModificar.CoArmado));
                    _Comando.Parameters.Add(new SqlParameter("@CoAdministrador", ArmadoDeSalaModificar.Administrador.CoAdministrador));
                    _Comando.ExecuteNonQuery();
                }
            }
            return Obtener(ArmadoDeSalaModificar.CoArmado);
        }


        public void Eliminar(ArmadoDeSala ArmadoDeSalaEliminar)
        {
            string _Sentencia = "DELETE FROM Armado_Sala WHERE CoArmado=@CoArmado";
            using (SqlConnection _Conexion = new SqlConnection(ConexionUtil.ObtenerCadena()))
            {
                _Conexion.Open();
                using (SqlCommand _Comando = new SqlCommand(_Sentencia, _Conexion))
                {
                    _Comando.Parameters.Add(new SqlParameter("@CoArmado", ArmadoDeSalaEliminar.CoArmado));
                    _Comando.ExecuteNonQuery();
                }
            }
        }

        // Métodos Listar
        public ICollection<ArmadoDeSala> ListarTodos()
        {
            string _Sentencia = "SELECT CoArmado, SsArmado, CoSala, CoInstrumento, CoServicio, CoAdministrador FROM Armado_Sala";
            ICollection<ArmadoDeSala> ArmadoDeSalaEncontrados = new List<ArmadoDeSala>();
            ArmadoDeSala ArmadoDeSalaEncontrado = null;
            using (SqlConnection _Conexion = new SqlConnection(ConexionUtil.ObtenerCadena()))
            {
                _Conexion.Open();
                using (SqlCommand _Comando = new SqlCommand(_Sentencia, _Conexion))
                {
                    using (SqlDataReader _Resultado = _Comando.ExecuteReader())
                    {
                        while (_Resultado.Read())
                        {
                            ArmadoDeSalaEncontrado = new ArmadoDeSala();
                            ArmadoDeSalaEncontrado.CoArmado = (int)_Resultado["CoArmado"];
                            ArmadoDeSalaEncontrado.SsArmado = (decimal)_Resultado["SsArmado"];
                            ArmadoDeSalaEncontrado.Sala = salaDAO.Obtener((int)_Resultado["CoSala"]);
                            ArmadoDeSalaEncontrado.Instrumento = instrumentoDAO.Obtener((int)_Resultado["CoInstrumento"]);
                            ArmadoDeSalaEncontrado.Servicio = servicioDAO.Obtener((int)_Resultado["CoServicio"]);
                            ArmadoDeSalaEncontrado.Administrador = admDAO.Obtener((int)_Resultado["CoAdministrador"]);
                            ArmadoDeSalaEncontrados.Add(ArmadoDeSalaEncontrado);
                        }
                    }
                }
            }
            return ArmadoDeSalaEncontrados;
        }


        public ICollection<ArmadoDeSala> ListarXSala(int Codsala)
        {
            string _Sentencia = "SELECT CoArmado, SsArmado, CoSala, CoInstrumento, CoServicio FROM Armado_Sala WHERE CoSala LIKE '%'+@CoSala+'%'";
            ICollection<ArmadoDeSala> ArmadoDeSalaEncontrados = new List<ArmadoDeSala>();
            ArmadoDeSala ArmadoDeSalaEncontrado = null;
            using (SqlConnection _Conexion = new SqlConnection(ConexionUtil.ObtenerCadena()))
            {
                _Conexion.Open();
                using (SqlCommand _Comando = new SqlCommand(_Sentencia, _Conexion))
                {
                    _Comando.Parameters.Add(new SqlParameter("@CoSala", Codsala));
                    using (SqlDataReader _Resultado = _Comando.ExecuteReader())
                    {
                        while (_Resultado.Read())
                        {
                            ArmadoDeSalaEncontrado = new ArmadoDeSala();
                            ArmadoDeSalaEncontrado.CoArmado = (int)_Resultado["CoArmado"];
                            ArmadoDeSalaEncontrado.SsArmado = (decimal)_Resultado["SsArmado"];
                            ArmadoDeSalaEncontrado.Sala = salaDAO.Obtener((int)_Resultado["CoSala"]);
                            ArmadoDeSalaEncontrado.Instrumento = instrumentoDAO.Obtener((int)_Resultado["codigo"]);
                            ArmadoDeSalaEncontrado.Servicio = servicioDAO.Obtener((int)_Resultado["codigo"]);
                            ArmadoDeSalaEncontrados.Add(ArmadoDeSalaEncontrado);
                        }
                    }
                }
            }
            return ArmadoDeSalaEncontrados;
        }

        private int GenerarNuevoCodigo()
        {
            string _Sentencia = "SELECT max(CoArmado) FROM Armado_Sala";
            int _NuevoCodigo = 0;
            using (SqlConnection _Conexion = new SqlConnection(ConexionUtil.ObtenerCadena()))
            {
                _Conexion.Open();
                using (SqlCommand _Comando = new SqlCommand(_Sentencia, _Conexion))
                {
                    object _Resultado = _Comando.ExecuteScalar();
                    if (DBNull.Value.Equals(_Resultado)) // No hay datos en la tabla
                        _NuevoCodigo = 1;
                    else
                        _NuevoCodigo = (int)_Resultado + 1;
                }
            }
            return _NuevoCodigo;
        }

    }
}